package com.kinyx.framework.utils;

import com.kinyx.framework.annotation.assist.CanNotNull;
import com.kinyx.framework.annotation.assist.ReturnNotNull;
import com.kinyx.framework.annotation.assist.Tester;

import lombok.AccessLevel;
import lombok.NoArgsConstructor;

/**
 * 字符工具类
 */
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class KCharUtils {

	/**
	 * 判断字符是否为大写字符（只做英文处理）
	 * <pre>
		Assert.assertTrue(KCharUtils.isUpperCase('A'));
		Assert.assertTrue(KCharUtils.isUpperCase('Z'));
	
		Assert.assertFalse(KCharUtils.isUpperCase('a'));
		Assert.assertFalse(KCharUtils.isUpperCase('z'));
	
		Assert.assertFalse(KCharUtils.isUpperCase('0'));
		Assert.assertFalse(KCharUtils.isUpperCase('9'));
	
		Assert.assertFalse(KCharUtils.isUpperCase('$'));
		Assert.assertFalse(KCharUtils.isUpperCase('@'));
	 * </pre>
	 * @param c 字符
	 * @return true：是大写字符；false：不是大写字符；
	 */
	@ReturnNotNull
	@Tester("com.kinyx.framework.utils.KCharUtils_Tester_Case")
	public static boolean isUpperCase(@CanNotNull final char c) {
		// return Character.isUpperCase(c);
		return (c >= 'A') && (c <= 'Z');
	}

	/**
	 * 判断字符是否为小写字符（只做英文处理）
	 * <pre>
		Assert.assertFalse(KCharUtils.isLowerCase('A'));
		Assert.assertFalse(KCharUtils.isLowerCase('Z'));
	
		Assert.assertTrue(KCharUtils.isLowerCase('a'));
		Assert.assertTrue(KCharUtils.isLowerCase('z'));
	
		Assert.assertFalse(KCharUtils.isLowerCase('0'));
		Assert.assertFalse(KCharUtils.isLowerCase('9'));
	
		Assert.assertFalse(KCharUtils.isLowerCase('$'));
		Assert.assertFalse(KCharUtils.isLowerCase('@'));
	 * </pre>
	 * @param c 字符
	 * @return true：是小写字符；false：不是小写字符；
	 */
	@ReturnNotNull
	@Tester("com.kinyx.framework.utils.KCharUtils_Tester_Case")
	public static boolean isLowerCase(@CanNotNull final char c) {
		// return Character.isLowerCase(c);
		return (c >= 'a') && (c <= 'z');
	}

	/**
	 * 将小写字符转换为大写字符（只做英文处理）
	 * <pre>
		Assert.assertEquals('A', KCharUtils.toUpperCase('A'));
		Assert.assertEquals('Z', KCharUtils.toUpperCase('Z'));
	
		Assert.assertEquals('A', KCharUtils.toUpperCase('a'));
		Assert.assertEquals('Z', KCharUtils.toUpperCase('z'));
	
		Assert.assertEquals('0', KCharUtils.toUpperCase('0'));
		Assert.assertEquals('9', KCharUtils.toUpperCase('9'));
	
		Assert.assertEquals('$', KCharUtils.toUpperCase('$'));
		Assert.assertEquals('@', KCharUtils.toUpperCase('@'));
	 * </pre>
	 * @param c 字符
	 * @return 非英文字符返回原值
	 */
	@ReturnNotNull
	@Tester("com.kinyx.framework.utils.KCharUtils_Tester_Case")
	public static char toUpperCase(@CanNotNull final char c) {
		return isLowerCase(c) ? (char) (c - 32) : c;
	}

	/**
	 * 将大写字符转换为小写字符（只做英文处理）
	 * <pre>
		Assert.assertEquals('a', KCharUtils.toLowerCase('A'));
		Assert.assertEquals('z', KCharUtils.toLowerCase('Z'));
	
		Assert.assertEquals('a', KCharUtils.toLowerCase('a'));
		Assert.assertEquals('z', KCharUtils.toLowerCase('z'));
	
		Assert.assertEquals('0', KCharUtils.toLowerCase('0'));
		Assert.assertEquals('9', KCharUtils.toLowerCase('9'));
	
		Assert.assertEquals('$', KCharUtils.toLowerCase('$'));
		Assert.assertEquals('@', KCharUtils.toLowerCase('@'));
	 * </pre>
	 * @param c 字符
	 * @return 非英文字符返回原值
	 */
	@ReturnNotNull
	@Tester("com.kinyx.framework.utils.KCharUtils_Tester_Case")
	public static char toLowerCase(@CanNotNull final char c) {
		return isUpperCase(c) ? (char) (c + 32) : c;
	}

	/**
	 * 判断字符是否为数字字符
	 * <pre>
		Assert.assertFalse(KCharUtils.isNumber('A'));
		Assert.assertFalse(KCharUtils.isNumber('Z'));
	
		Assert.assertFalse(KCharUtils.isNumber('a'));
		Assert.assertFalse(KCharUtils.isNumber('z'));
	
		Assert.assertTrue(KCharUtils.isNumber('0'));
		Assert.assertTrue(KCharUtils.isNumber('9'));
	
		Assert.assertFalse(KCharUtils.isNumber('$'));
		Assert.assertFalse(KCharUtils.isNumber('@'));
	 * </pre>
	 * @param c 字符
	 * @return true：是数字字符；false：不是数字字符；
	 */
	@ReturnNotNull
	@Tester("com.kinyx.framework.utils.KCharUtils_Tester_Case")
	public static boolean isNumber(@CanNotNull final char c) {
		// return Character.isUpperCase(c);
		return (c >= '0') && (c <= '9');
	}

	/**
	 * 字符值转换为整型值
	 * <pre>
		Assert.assertTrue(KCharUtils.char2int('A') == -1);
		Assert.assertTrue(KCharUtils.char2int('Z') == -1);
	
		Assert.assertTrue(KCharUtils.char2int('a') == -1);
		Assert.assertTrue(KCharUtils.char2int('z') == -1);
	
		Assert.assertTrue(KCharUtils.char2int('0') == 0);
		Assert.assertTrue(KCharUtils.char2int('9') == 9);
	
		Assert.assertTrue(KCharUtils.char2int('$') == -1);
		Assert.assertTrue(KCharUtils.char2int('@') == -1);
	 * </pre>
	 * @param c 字符
	 * @return 非数字字符返回-1。
	 */
	@ReturnNotNull
	@Tester("com.kinyx.framework.utils.KCharUtils_Tester_char2int")
	public static int char2int(@CanNotNull final char c) {
		return isNumber(c) ? c - '0' : -1;
	}

}
